
from flask import Flask
from app.core.error_handlers import register_error_handlers
from app.core.extensions import db, jwt, init_extensions
from app.core.logging_config import init_logging
from app.core.middleware import register_middlewares
from app.core.model_init import initialize_models, register_retrain_route
from flask_cors import CORS
from app.config import Config
from app.services.ocr.service.controller import system_upload_file, system_upload_b64
from app.services.ocr_engine.ai_model import initialize, train_model, search_with_text
from app.services.auth import token_required


def create_app(config_class=Config):
    """
    Flask应用工厂函数
    :param config_class: 配置类，默认使用 app.config.Config
    :return: Flask 应用实例
    """
    app = Flask(__name__)

    # 先加载配置文件，确保后续组件初始化能拿到配置信息
    app.config.from_object(config_class)

    # 这里强制设置 JWT 密钥，覆盖配置里的（可选）
    app.config['JWT_SECRET_KEY'] = '1231撒大苏打sd123125————0das'

    # 初始化日志系统，方便全局日志输出
    init_logging()

    # 跨域支持，允许前端跨域访问 /api/* 路径接口，并允许携带cookie
    CORS(app, resources={r"/api/*": {"origins": "*"}}, supports_credentials=True)

    # 注册自定义的中间件，比如请求开始结束时间记录、请求参数打印等
    register_middlewares(app)

    # 注册统一的错误处理函数，用于捕获异常返回标准格式的错误响应
    register_error_handlers(app)
    # 初始化数据库扩展，绑定Flask应用
    init_extensions(app)
    # # 初始化数据库扩展，绑定Flask应用
    # db.init_app(app)
    #
    # # 初始化JWT扩展，支持token认证
    # jwt.init_app(app)

    # 延迟导入蓝图并注册，避免循环导入导致的错误
    from app.apis import register_blueprints, initialize_services
    register_blueprints(app)
    initialize_services(app)
    # 在应用上下文中执行数据库模型初始化、模型训练路由注册等任务
    with app.app_context():
        # 初始化AI模型或其他资源
        initialize_models()
        # 注册AI模型重新训练的API路由，方便运维调用
        register_retrain_route(app)
        # 注册租户相关事件
        from app.core.BaseQuery import register_tenant_events, setup_tenant_filtering, setup_query_filtering
        register_tenant_events(db)
        # 设置租户过滤功能
        setup_tenant_filtering()
        # 设置查询过滤
        setup_query_filtering()
        # 初始化默认数据
        from app.core.default_data import init_default_data
        init_default_data()

        # 初始化租户配置（从环境变量迁移）
        from app.services.tenant_config_service import init_default_tenant_configs
        init_default_tenant_configs()

    # 添加一个基础根路由，供健康检查或API根目录访问
    @app.route('/', methods=['GET'])
    def index():
        from flask import jsonify
        return jsonify({"status": "ok", "message": "看什么看 服务器正常运行"})

    return app
